﻿#ifndef CWORKTEST_REDISCLIENT_H
#define CWORKTEST_REDISCLIENT_H

#pragma once
#include <sw/redis++/redis++.h>
#include <memory>
#include <mutex>
#include <iostream>
#include <optional>
#include <functional>
#include <thread>

class RedisClient {
public:
    // 获取单例实例
    static RedisClient& getInstance();

    // 禁止拷贝和赋值
    RedisClient(const RedisClient&) = delete;
    RedisClient& operator=(const RedisClient&) = delete;

    // 设置键值，带可选过期时间
    bool set(const std::string& key, const std::string& value, int ttl = 0);

    // 获取值
    std::optional<std::string> get(const std::string& key);

    // 删除键
    bool del(const std::string& key);

    // 队列操作：LPUSH
    void lpush(const std::string& list, const std::string& value);

    // 队列操作：RPOP
    std::optional<std::string> rpop(const std::string& list);

    // 发布消息
    bool publish(const std::string& channel, const std::string& message);

    // 订阅消息（回调函数会在独立线程中执行）
    void subscribe(const std::string& channel, std::function<void(const std::string&)> callback);

private:
    RedisClient();  // 构造函数
    ~RedisClient();

private:
    std::unique_ptr<sw::redis::Redis> _redis;      // KV 操作
    std::unique_ptr<sw::redis::Redis> _subRedis;   // 订阅独立连接
    std::unique_ptr<sw::redis::Subscriber> _subscriber;
};

#endif //CWORKTEST_REDISCLIENT_H
